从源代码可以看到,SQlite在win32下的锁,用的是系统中的临界区,且全部为二元临界区,一把锁,即是一个互斥锁,故本文开头也时常说是互斥体,如有不妥,纯属无知,还请见谅。
SQlite总共有六个临界区,每把锁有各自用途,但纯粹从mutex_w32.c这个文件来看,无法分析每把锁的具体用途,以至于对图SQLite锁的状态以及状态的转换(见2.2锁的流程)产生误读,因为单纯从mutex_w32.c这个角度来看,无法构造出每个步骤的锁的转换流程,就如同低维生物无法理解高维世界,底层只提供调用方式,管中窥豹,无法窥见程序全貌。锁的状态以及状态的转换,具体对应代码实现应该是在os_win.c。
互斥锁初始化如下
static int winMutexInit(void){
/* The first to increment to 1 does actual initialization */
// PVOID *Destination,
// PVOID Exchange,
// PVOID Compera
if( InterlockedCompareExchange(&winMutex_lock, 1, 0)==0 ){//2元临界区 一次只进一个
int i;
for(i=0; i<ArraySize(winMutex_staticMutexes); i++){
#if SQLITE_OS_WINRT
InitializeCriticalSectionEx(&winMutex_staticMutexes[i].mutex, 0, 0); //OS_WINRT 系统才有
#else
InitializeCriticalSection(&winMutex_staticMutexes[i].mutex);//初始化6个临界区
#endif
}
winMutex_isInit = 1;//初始化完成后赋值1
}else{
/* Someone else is in the process of initing the static mutexes */
while( !winMutex_isInit ){
sqlite3_win32_sleep(1);//2元临界区,进不了的睡觉
}
}
return SQLITE_OK;
}